package com.game.jumper.bean;

import com.game.jumper.game.Constant;

/**
 * 球对象定义类
 * 
 * @author houjibo
 */
public class Ball
{
	/**
	 * 球心的X坐标
	 */
	private double x;

	/**
	 * 球心的Y坐标
	 */
	private double y;

	/**
	 * 球的半径
	 */
	private double r;

	/**
	 * 球的状态
	 */
	private BallState state;

	/**
	 * 球在X方向上的速度，正值向右，负值向左
	 */
	private double xSpeed;

	/**
	 * 球在Y方向上的速度，正值向下，负值向上
	 */
	private double ySpeed;

	/**
	 * 重力加速度
	 */
	double g;

	/**
	 * 是否处于飞行状态：true为飞行，false为静止
	 */
	boolean fly = false;

	/**
	 * 是否处于准备飞行状态：true为是，false为否
	 */
	boolean ready = false;

	/**
	 * 构造方法
	 */
	public Ball()
	{
		super();
		g = Constant.Unit * Constant.G_RATIO;
		this.state = BallState.Normal;
	}

	/**
	 * 设置准备状态
	 * 
	 * @param ready
	 */
	public void setReady(boolean ready)
	{
		this.ready = ready;
	}

	/**
	 * 判断是否为飞行状态
	 * 
	 * @return
	 */
	public boolean isFly()
	{
		return fly;
	}

	/**
	 * 设置飞行状态
	 * 
	 * @param fly
	 */
	public void setFly(boolean fly)
	{
		this.fly = fly;
	}

	/**
	 * 更新自身状态
	 * 
	 * @param ticks 时间周期
	 */
	public void update(double ticks)
	{
		// 在非准备状态下，按照游戏速度下降
		if (!ready)
		{
			y += ticks * Constant.Vdown;
		}
		// 如果处于飞行状态，按飞行速度更新小球坐标
		if (fly)
		{
			// 按一个周期发生位移，并减少Y方向的速度
			x += xSpeed * ticks;
			y -= ySpeed * ticks;
			ySpeed -= g * ticks;
			// 不允许小球跳出屏幕上方
			if (y < 0)
			{
				y = 0;
				ySpeed = 0;
			}
			// 小球碰到左侧或右侧屏幕时发生弹性碰撞
			if (x < 0)
			{
				x = 0;
				xSpeed = -xSpeed;
			}
			if (x > Constant.Width)
			{
				x = Constant.Width;
				xSpeed = -xSpeed;
			}
		}
	}

	/**
	 * 按给定初速度做飞行动作
	 * 
	 * @param xSpeed
	 * @param ySpeed
	 */
	public void doFly(double xSpeed, double ySpeed)
	{
		fly = true;
		this.xSpeed = xSpeed;
		this.ySpeed = ySpeed;
	}

	/**
	 * 获取球心X坐标
	 * 
	 * @return 球心X坐标
	 */
	public double getX()
	{
		return x;
	}

	/**
	 * 获取球心Y坐标
	 * 
	 * @return 球心Y坐标
	 */
	public double getY()
	{
		return y;
	}

	/**
	 * 获取球半径
	 * 
	 * @return 球半径
	 */
	public double getR()
	{
		return r;
	}

	/**
	 * 获取球的状态
	 * 
	 * @return 球的状态
	 */
	public BallState getState()
	{
		return state;
	}

	/**
	 * 设置球心坐标X
	 * 
	 * @param x
	 */
	public void setX(double x)
	{
		this.x = x;
	}

	/**
	 * 设置球心坐标Y
	 * 
	 * @param y
	 */
	public void setY(double y)
	{
		this.y = y;
	}

	/**
	 * 设置球半径
	 * 
	 * @param r
	 */
	public void setR(double r)
	{
		this.r = r;
	}

	/**
	 * 设置小球的状态
	 * 
	 * @param state
	 */
	public void setState(BallState state)
	{
		this.state = state;
	}

	/**
	 * 判断小球是否死亡
	 * 
	 * @return 小球是否死亡
	 */
	public boolean isDead()
	{
		return state == BallState.Dead;
	}

	/**
	 * 获取小球X方向上的速度
	 * 
	 * @return 小球X方向上的速度
	 */
	public double getxSpeed()
	{
		return xSpeed;
	}

	/**
	 * 设置小球在X方向上的速度
	 * 
	 * @param xSpeed
	 */
	public void setxSpeed0(double xSpeed)
	{
		this.xSpeed = xSpeed;
	}

	/**
	 * 获取小球Y方向上的速度
	 * 
	 * @return 小球Y方向上的速度
	 */
	public double getySpeed0()
	{
		return ySpeed;
	}

	/**
	 * 设置小球在Y方向上的速度
	 * 
	 * @param ySpeed
	 */
	public void setySpeed0(double ySpeed0)
	{
		this.ySpeed = ySpeed0;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String toString()
	{
		return "Ball [x=" + x + ", y=" + y + ", r=" + r + ", state=" + state + ", xSpeed=" + xSpeed + ", ySpeed="
				+ ySpeed + ", fly=" + fly + ", ready=" + ready + "]";
	}
}
